# Долгосрочное домашнее задание (игра "Shooter")

## Этап I
Время на этап: **24 часа**

### Цель

Необходимо разработать игру для одного пользователя против ботов.
Игра должна представлять собой 2D-шутер,
включать в себя элементы жанра roguelike. Правила можно найти в интеренете и ниже в ТЗ.

### Задание

На этом этапе необходимо реализовать desktop-приложение, c графической отрисовкой процесса игры и реализующее основную логику игры.

#### Функционал, который должен быть реализован:
1. Игровое меню
    * кнопка **Начать игру** - запрос имени игрока и запуск игры;
    * кнопка **Сложность** - выбор уровня сложности (одна, две или три звезды);
    * кнопка **Статистика** - показывает результаты предыдущих игроков;
    * кнопка **Выход** - выход из игры.
2. Игровой процесс
    * возможность управлять своим персонажем
    * возможность поставить игру на паузу с отображением **Меню паузы**:
        * отображение кнопки **Выход в меню**
        * отображение кнопки **Возобновить игру**
        * отображение кнопки **Перезагрузить игру**
    * визуальная часть:
        * отображение интерфейса с отоборажением уровня здоровья, количества патронов, уровня сложности
    * по завершению игры вывод экрана смерти, имени и заработанных очков, кнопки **Выход в меню** или **Перезагрузить игру**;
    * логика игры:
        * каждый раз генерируется новая карта из n-го количества связанных комнат;
        * количество врагов зависит от уровня сложности, есть три типа врагов: умирающие от одного, двух или от трех попаданий;
        * каждый тип врага наносит свой урон, чем выше тип - тем больше наносимый урон;
        * количество врагов постоянно, то есть при убийстве одного появляется другой в произвольном месте карты; 
        * игрок может бежать вперед, назад, влево, вправо и делать выстрел по направлению движения;
        * на карте случайным образом появляются бонусы: **аптечки**, **патроны**;
        * игрок проигрывает, если у него заканчивается здоровье;
        * возможности победить нет, игра заканчивается гибелью персонажа;

### Командная разработка

Далее пошагово представлен **пример** процесса реализации игры на этапе I. Каждый из членов команды выбирает себе задание, 
согласовав этот шаг разработки с остальными участниками команды. Шаги разработки составлены так, что **лучше всего** для команды — полностью закрыть все задачи **конкретного** шага, прежде чем переходить к **следующему** шагу (тут вам потребуется командная работа).

На каждом шаге разработки ожидается **очевидный** промежуточный результат от команды. Команда должна иметь возможность отчитаться в любой момент о состоянии дел по разработке игры. Основное ТЗ можно посмотреть ещё раз 
[тут](#функционал-который-должен-быть-реализован), подробное ТЗ будет расписано в каждом шаге.

#### Шаги разработки:

1. Время на работу: **6 часов**  
   
   * **Разработка макета визуальной части процесса игры и части главного меню**.  
     
     Необходимо разработать подробный макет (в любом из доступных средств визуализации макетов) основного экрана игры.
     На экране должны быть: 
     * **количество патронов в магазине**
     * **уровень здоровья**;
     * сама **карта**, по которой будут передвигаться игроки и боты. Очевидно, что всё это должно лаконично смотреться и не "накладываться" друг на друга.
     
     Для каждой отдельной кнопки меню необходимо сделать "подсвечивание" кнопки.
     
   * **Разработка основного меню игры**.  
     
     Необходимо разработать основное меню игры с кнопками: **Начать игру**, **Сложность**, **Статистика** и **Выход** с указанным ранее функционалом.        
          
   Для этого шага разработки **результатом** является готовое меню с фоном. Каждая кнопка должна открывать своё окно.

2. Время на работу: **12 часов**  
   
   * **Визуализация окна игры**  
     
     На этом шаге необходимо отобразить на экран всё то, что было нанесено на макет на предыдущем шаге. На экране могут быть "заглушки". Главное, чтобы был реализован такой функционал, который позволит другому члену команды использовать прописанные игроками параметры, чтобы связать визуализацию с логикой.  
     
   * **Привязка визуальной составляющей с логикой игры**  
     
     Необходимо написать функционал, который позволяет получать параметры, вводимые игроками на предыдущем шаге, чтобы использовать их для визуализации на экране и для реализации логики игры. Здесь необходимо параллельное взаимодействие двух членов команды, чтобы по итогу полученные на предыдущем шаге параметры игроков корректно отображались на экране игры.  

   * **Написение логики генерации карты**

     Необходимо написать функционал, который позволяет получить случайно сгенерированную карту, во все комнаты которой можно попасть.

   * **Написание логики движения игроков и ботов**
     
     Необходимо написать функционал, который отображает на экране игрока и ботов в случайных местах на карте и заставляет их двигаться в случайном направлении. Необходимо написать функционал, позволяющий управлять игроком на карте. Необходимо, чтобы игрок и боты не могли покидать пределы комнаты через стены, если игрок или бот подошел близко к стене, он не может продолжить движение. Необходимо реализовать возможность перехода в другую комнату через двери для игрока.

    * **Написание логики стрельбы игроков и ботов**
     
     Необходимо написать функционал, реализующий стрельбу игрока на левую кнопку мыши или другую кнопку в направлении курсора. Необходимо написать функционал, заставляющий ботов стрелять в направлении игрока. Необходимо, чтобы пули исчезали при столкновении со стеной.

   Для этого шага разработки **результатом** является основное окно игры с отображенным **интерфейсом** с отоборажением уровня здоровья количества патронов; основная карта с игроком и ботами на ней.
   Должна быть реализована логика движения игрока с возможностью управления и возможностью перехода в соседние комнаты, невозможностью прохождения через стены.
   Также должна быть реализована логика стрельбы ботов и персонажа с регистрацией попаданий по персонажу и ботам.

3. Время на работу: **6 часов**
  
     * **Реализация логики и визуализации бонусов**  
     
     Необходимо реализовать логику, появления на карте бонусов(аптечки, патроны) в случайных местах комнаты при ее зачистке.

     Каждый бонус должен иметь свое уникальное графическое представление.

     * **Реализация окна паузы**  
    
     Необходимо реализовать окно, которое будет появляться при нажатии клавиши "ESC". На диалоговом окне необходимо реализовать функционал, представленный ранее в ТЗ.

  * **Реализация логики и экрана перехода на новый уровень**

     Необходимо реализовать логику для перехода на новый уровень, при прохождении определенного количества комнат. При переходе на новый уровень на экране должно появлять сообщение о смене уровня, при этом сложность должна повышаться.
           
   * **Реализация диалогового окна по завершению игры**  
    
     Необходимо написать диалоговое окно, которое вызывается в случае смерти игрока. При этом диалоговое должно появляться после экрана смерти, на самом диалоговом окне должно быть отражено
       * **никнейм игрока** и **количество убийств**
  * **Реализация сохранения и шифрования рекордов в отдельном файле**
     Необходимо написать функционал, отвечающий за записывание рекордов в отдельный файл, данные должны храниться в зашифрованном виде.

   Для этого шага разработки **результатом** является реализованная логика появления бонусов, объектов на карте, взаимодействия с ними, а также вывод всех сопутствующих **работающих** окон в случае завершения игры или паузы (нажатие на клавишу "ESC"). На этом шаге игра должна выглядеть готовой для комфортной однопользовательской игры.
 
    
## Этап II
Время на этап: **18 часов**

### Цель

Необходимо разработать многопользовательскую (на 2 игрока) версию игры.
Игроки не могут наносить урон друг другу, стрелять через друг друга.

В этом этапе необходимо дополнительно в игру включить:
* Выбор количество игроков - 1 или 2 при начале игры
* запись статистики в отдельный файл по игрокам и вывод статистики при нажатии клавиши **Статистика** в главном меню

Функционал и задачи определить самостоятельно аналогично первому этапу. Второй этап это развитие первого этапа в многопользовательском режиме.
